home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 March / PCWorld_2001-03_cd.bin / Software / TemaCD / classbuild / ClassBuilder 2.2 PR405 Setup.exe / {app} / Include / CB_StaticMulti.h < prev    next >
C/C++ Source or Header  |  2000-04-07  |  15KB  |  447 lines

  1. #ifndef CB_STATIC_MULTI_H
  2. #define CB_STATIC_MULTI_H
  3.  
  4. #include <assert.h>
  5.  
  6. #include "CB_IteratorStaticMulti.h"
  7.  
  8. // defines for include files
  9. #define RELATION_STATIC_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  10. public:\
  11.     static ClassTo* _first##NameTo;\
  12.     static ClassTo* _last##NameTo;\
  13.     static int _count##NameTo;\
  14. \
  15. public:\
  16.     static void Add##NameTo##First(ClassTo* item);\
  17.     static void Add##NameTo##Last(ClassTo* item);\
  18.     static void Add##NameTo##After(ClassTo* item, ClassTo* pos);\
  19.     static void Add##NameTo##Before(ClassTo* item, ClassTo* pos);\
  20.     static void Remove##NameTo(ClassTo* item);\
  21.     static void RemoveAll##NameTo();\
  22.     static void DeleteAll##NameTo();\
  23.     static void Replace##NameTo(ClassTo* item, ClassTo* newItem);\
  24.     static ClassTo* GetFirst##NameTo();\
  25.     static ClassTo* GetLast##NameTo();\
  26.     static ClassTo* GetNext##NameTo(ClassTo* pos);\
  27.     static ClassTo* GetPrev##NameTo(ClassTo* pos);\
  28.     static int Get##NameTo##Count();\
  29.     static int Includes##NameTo(ClassTo* item);\
  30.     static void Move##NameTo##First(ClassTo* item);\
  31.     static void Move##NameTo##Last(ClassTo* item);\
  32.     static void Move##NameTo##After(ClassTo* item, ClassTo* pos);\
  33.     static void Move##NameTo##Before(ClassTo* item, ClassTo* pos);\
  34.     static void Sort##NameTo(int (*comp)(ClassTo*, ClassTo*));\
  35.     ITERATOR_STATIC_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  36.  
  37. #define RELATION_NOFILTER_STATIC_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  38. public:\
  39.     static ClassTo* _first##NameTo;\
  40.     static ClassTo* _last##NameTo;\
  41.     static int _count##NameTo;\
  42. \
  43. public:\
  44.     static void Add##NameTo##First(ClassTo* item);\
  45.     static void Add##NameTo##Last(ClassTo* item);\
  46.     static void Add##NameTo##After(ClassTo* item, ClassTo* pos);\
  47.     static void Add##NameTo##Before(ClassTo* item, ClassTo* pos);\
  48.     static void Remove##NameTo(ClassTo* item);\
  49.     static void RemoveAll##NameTo();\
  50.     static void DeleteAll##NameTo();\
  51.     static void Replace##NameTo(ClassTo* item, ClassTo* newItem);\
  52.     static ClassTo* GetFirst##NameTo();\
  53.     static ClassTo* GetLast##NameTo();\
  54.     static ClassTo* GetNext##NameTo(ClassTo* pos);\
  55.     static ClassTo* GetPrev##NameTo(ClassTo* pos);\
  56.     static int Get##NameTo##Count();\
  57.     static int Includes##NameTo(ClassTo* item);\
  58.     static void Move##NameTo##First(ClassTo* item);\
  59.     static void Move##NameTo##Last(ClassTo* item);\
  60.     static void Move##NameTo##After(ClassTo* item, ClassTo* pos);\
  61.     static void Move##NameTo##Before(ClassTo* item, ClassTo* pos);\
  62.     static void Sort##NameTo(int (*comp)(ClassTo*, ClassTo*));\
  63.     ITERATOR_NOFILTER_STATIC_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  64.  
  65. #define RELATION_STATIC_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  66. public:\
  67.     ClassTo* _prev##NameFrom;\
  68.     ClassTo* _next##NameFrom;
  69.  
  70. // defines implementation
  71. #define INIT_STATIC_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) 
  72.  
  73. #define EXIT_STATIC_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  74.  
  75. #define REPLACE_STATIC_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  76.  
  77. #define INIT_STATIC_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  78.     _prev##NameFrom = (ClassTo*)0;\
  79.     _next##NameFrom = (ClassTo*)0;
  80.  
  81. #define EXIT_STATIC_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  82.     assert(this);\
  83.     if (_prev##NameFrom || _next##NameFrom || ClassFrom##::GetFirst##NameTo() == this)\
  84.     {\
  85.         ClassFrom::NameTo##Iterator::Check(this);\
  86. \
  87.         ClassFrom::_count##NameTo--;\
  88. \
  89.         if (_next##NameFrom)\
  90.             _next##NameFrom->_prev##NameFrom = _prev##NameFrom;\
  91.         else\
  92.             ClassFrom::_last##NameTo = _prev##NameFrom;\
  93. \
  94.         if (_prev##NameFrom)\
  95.             _prev##NameFrom->_next##NameFrom = _next##NameFrom;\
  96.         else\
  97.             ClassFrom::_first##NameTo = _next##NameFrom;\
  98. \
  99.         _prev##NameFrom = (ClassTo*)0;\
  100.         _next##NameFrom = (ClassTo*)0;\
  101.     }
  102.  
  103. #define REPLACE_STATIC_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  104.     assert(this);\
  105.     assert(pOld);\
  106.     if ((pOld->_prev##NameFrom != (ClassTo*)0) ||\
  107.         (pOld->_next##NameFrom != (ClassTo*)0) ||\
  108.         (ClassFrom::GetFirst##NameTo() == pOld))\
  109.     {\
  110.         ClassFrom::NameTo##Iterator::Check(pOld, this);\
  111. \
  112.         if (pOld->_next##NameFrom)\
  113.             pOld->_next##NameFrom->_prev##NameFrom = this;\
  114.         else\
  115.             ClassFrom::_last##NameTo = this;\
  116. \
  117.         if (pOld->_prev##NameFrom)\
  118.             pOld->_prev##NameFrom->_next##NameFrom = this;\
  119.         else\
  120.             ClassFrom::_first##NameTo = this;\
  121. \
  122.         _next##NameFrom = pOld->_next##NameFrom;\
  123.         _prev##NameFrom = pOld->_prev##NameFrom;\
  124. \
  125.         pOld->_next##NameFrom = (ClassTo*)0;\
  126.         pOld->_prev##NameFrom = (ClassTo*)0;\
  127.     }\
  128.     else\
  129.     {\
  130.         _prev##NameFrom = (ClassTo*)0;\
  131.         _next##NameFrom = (ClassTo*)0;\
  132.     }
  133.  
  134. #define METHODS_STATIC_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  135.     ClassTo* ClassFrom##::_first##NameTo = (ClassTo*)0;\
  136.     ClassTo* ClassFrom##::_last##NameTo = (ClassTo*)0;\
  137.     int ClassFrom##::_count##NameTo = 0;\
  138. void ClassFrom##::Add##NameTo##First(ClassTo* item)\
  139. {\
  140.     METHOD_STATIC_MULTI_ADDFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  141. }\
  142. \
  143. void ClassFrom##::Add##NameTo##Last(ClassTo* item)\
  144. {\
  145.     METHOD_STATIC_MULTI_ADDLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  146. }\
  147. \
  148. void ClassFrom##::Add##NameTo##After(ClassTo* item, ClassTo* pos)\
  149. {\
  150.     METHOD_STATIC_MULTI_ADDAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  151. }\
  152. \
  153. void ClassFrom##::Add##NameTo##Before(ClassTo* item, ClassTo* pos)\
  154. {\
  155.     METHOD_STATIC_MULTI_ADDBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  156. }\
  157. \
  158. void ClassFrom##::Remove##NameTo(ClassTo* item)\
  159. {\
  160.     METHOD_STATIC_MULTI_REMOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  161. }\
  162. \
  163. void ClassFrom##::RemoveAll##NameTo()\
  164. {\
  165.     METHOD_STATIC_MULTI_REMOVEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  166. }\
  167. \
  168. void ClassFrom##::DeleteAll##NameTo()\
  169. {\
  170.     METHOD_STATIC_MULTI_DELETEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  171. }\
  172. \
  173. void ClassFrom##::Replace##NameTo(ClassTo* item, ClassTo* newItem)\
  174. {\
  175.     METHOD_STATIC_MULTI_REPLACE(ClassFrom, NameFrom, ClassTo, NameTo) \
  176. }\
  177. \
  178. ClassTo* ClassFrom##::GetFirst##NameTo()\
  179. {\
  180.     METHOD_STATIC_MULTI_GETFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  181. }\
  182. \
  183. ClassTo* ClassFrom##::GetLast##NameTo()\
  184. {\
  185.     METHOD_STATIC_MULTI_GETLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  186. }\
  187. \
  188. ClassTo* ClassFrom##::GetNext##NameTo(ClassTo* pos)\
  189. {\
  190.     METHOD_STATIC_MULTI_GETNEXT(ClassFrom, NameFrom, ClassTo, NameTo) \
  191. }\
  192. \
  193. ClassTo* ClassFrom##::GetPrev##NameTo(ClassTo* pos)\
  194. {\
  195.     METHOD_STATIC_MULTI_GETPREV(ClassFrom, NameFrom, ClassTo, NameTo) \
  196. }\
  197. \
  198. int ClassFrom##::Get##NameTo##Count()\
  199. {\
  200.     METHOD_STATIC_MULTI_GETCOUNT(ClassFrom, NameFrom, ClassTo, NameTo) \
  201. }\
  202. \
  203. int ClassFrom##::Includes##NameTo(ClassTo* item)\
  204. {\
  205.     METHOD_STATIC_MULTI_INCLUDES(ClassFrom, NameFrom, ClassTo, NameTo) \
  206. }\
  207. \
  208. void ClassFrom##::Move##NameTo##First(ClassTo* item)\
  209. {\
  210.     METHOD_STATIC_MULTI_MOVEFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  211. }\
  212. \
  213. void ClassFrom##::Move##NameTo##Last(ClassTo* item)\
  214. {\
  215.     METHOD_STATIC_MULTI_MOVELAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  216. }\
  217. \
  218. void ClassFrom##::Move##NameTo##After(ClassTo* item, ClassTo* pos)\
  219. {\
  220.     METHOD_STATIC_MULTI_MOVEAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  221. }\
  222. \
  223. void ClassFrom##::Move##NameTo##Before(ClassTo* item, ClassTo* pos)\
  224. {\
  225.     METHOD_STATIC_MULTI_MOVEBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  226. }\
  227. \
  228. void ClassFrom##::Sort##NameTo(int (*comp)(ClassTo*, ClassTo*))\
  229. {\
  230.     METHOD_STATIC_MULTI_SORT(ClassFrom, NameFrom, ClassTo, NameTo) \
  231. }
  232.  
  233. #define METHOD_STATIC_MULTI_ADDFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  234.     assert(item);\
  235.     assert(item->_prev##NameFrom == (ClassTo*)0 &&\
  236.             item->_next##NameFrom == (ClassTo*)0 &&\
  237.             (_first##NameTo != item));\
  238. \
  239.     _count##NameTo++;\
  240. \
  241.     if (_first##NameTo)\
  242.     {\
  243.         _first##NameTo->_prev##NameFrom = item;\
  244.         item->_next##NameFrom = _first##NameTo;\
  245.         _first##NameTo = item;\
  246.     }\
  247.     else\
  248.         _first##NameTo = _last##NameTo = item;
  249.  
  250. #define METHOD_STATIC_MULTI_ADDLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  251.     assert(item);\
  252.     assert(item->_prev##NameFrom == (ClassTo*)0 &&\
  253.             item->_next##NameFrom == (ClassTo*)0 &&\
  254.             (_first##NameTo != item));\
  255. \
  256.     _count##NameTo++;\
  257. \
  258.     if (_last##NameTo)\
  259.     {\
  260.         _last##NameTo->_next##NameFrom = item;\
  261.         item->_prev##NameFrom = _last##NameTo;\
  262.         _last##NameTo = item;\
  263.     }\
  264.     else\
  265.         _first##NameTo = _last##NameTo = item;
  266.  
  267. #define METHOD_STATIC_MULTI_ADDAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  268.     assert(pos);\
  269.     assert((pos->_prev##NameFrom != (ClassTo*)0) ||\
  270.             (pos->_next##NameFrom != (ClassTo*)0) ||\
  271.             (_first##NameTo == pos));\
  272. \
  273.     assert(item);\
  274.     assert(item->_prev##NameFrom == (ClassTo*)0 &&\
  275.             item->_next##NameFrom == (ClassTo*)0 &&\
  276.             (_first##NameTo != item));\
  277. \
  278.     _count##NameTo++;\
  279. \
  280.     item->_prev##NameFrom = pos;\
  281.     item->_next##NameFrom = pos->_next##NameFrom;\
  282.     pos->_next##NameFrom  = item;\
  283. \
  284.     if (item->_next##NameFrom)\
  285.         item->_next##NameFrom->_prev##NameFrom = item;\
  286.     else\
  287.         _last##NameTo = item;
  288.  
  289. #define METHOD_STATIC_MULTI_ADDBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  290.     assert(pos);\
  291.     assert((pos->_prev##NameFrom != (ClassTo*)0) ||\
  292.             (pos->_next##NameFrom != (ClassTo*)0) ||\
  293.             (_first##NameTo == pos));\
  294. \
  295.     assert(item);\
  296. \
  297.     assert(item->_prev##NameFrom == (ClassTo*)0 &&\
  298.             item->_next##NameFrom == (ClassTo*)0 &&\
  299.             (_first##NameTo != item));\
  300. \
  301.     _count##NameTo++;\
  302. \
  303.     item->_next##NameFrom = pos;\
  304.     item->_prev##NameFrom = pos->_prev##NameFrom;\
  305.     pos->_prev##NameFrom  = item;\
  306. \
  307.     if (item->_prev##NameFrom)\
  308.         item->_prev##NameFrom->_next##NameFrom = item;\
  309.     else\
  310.         _first##NameTo = item;
  311.  
  312. #define METHOD_STATIC_MULTI_REMOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  313.     assert(item);\
  314.     assert((item->_prev##NameFrom != (ClassTo*)0) ||\
  315.             (item->_next##NameFrom != (ClassTo*)0) ||\
  316.             (_first##NameTo == item));\
  317. \
  318.     ClassFrom##::##NameTo##Iterator::Check(item);\
  319. \
  320.     _count##NameTo--;\
  321. \
  322.     if (item->_next##NameFrom)\
  323.         item->_next##NameFrom->_prev##NameFrom = item->_prev##NameFrom;\
  324.     else\
  325.         _last##NameTo = item->_prev##NameFrom;\
  326. \
  327.     if (item->_prev##NameFrom)\
  328.         item->_prev##NameFrom->_next##NameFrom = item->_next##NameFrom;\
  329.     else\
  330.         _first##NameTo = item->_next##NameFrom;\
  331. \
  332.     item->_prev##NameFrom = (ClassTo*)0;\
  333.     item->_next##NameFrom = (ClassTo*)0;
  334.  
  335. #define METHOD_STATIC_MULTI_REMOVEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  336.     for (ClassTo* item = GetFirst##NameTo(); item; item = GetFirst##NameTo())\
  337.           Remove##NameTo(item);
  338.  
  339. #define METHOD_STATIC_MULTI_DELETEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  340.     for (ClassTo* item = GetFirst##NameTo(); item; item = GetFirst##NameTo())\
  341.           delete item;
  342.  
  343. #define METHOD_STATIC_MULTI_REPLACE(ClassFrom, NameFrom, ClassTo, NameTo) \
  344.     assert(item);\
  345.     assert((item->_prev##NameFrom != (ClassTo*)0) ||\
  346.             (item->_next##NameFrom != (ClassTo*)0) ||\
  347.             (_first##NameTo == item));\
  348. \
  349.     assert(newItem);\
  350.     assert(newItem->_prev##NameFrom == (ClassTo*)0 &&\
  351.             newItem->_next##NameFrom == (ClassTo*)0 &&\
  352.             (_first##NameTo != newItem));\
  353. \
  354.     ClassFrom##::##NameTo##Iterator::Check(item, newItem);\
  355. \
  356.     if (item->_next##NameFrom)\
  357.         item->_next##NameFrom->_prev##NameFrom = newItem;\
  358.     else\
  359.         _last##NameTo = newItem;\
  360. \
  361.     if (item->_prev##NameFrom)\
  362.         item->_prev##NameFrom->_next##NameFrom = newItem;\
  363.     else\
  364.         _first##NameTo = newItem;\
  365. \
  366.     newItem->_next##NameFrom = item->_next##NameFrom;\
  367.     newItem->_prev##NameFrom = item->_prev##NameFrom;\
  368.     item->_next##NameFrom = (ClassTo*)0;\
  369.     item->_prev##NameFrom = (ClassTo*)0;
  370.  
  371. #define METHOD_STATIC_MULTI_GETFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  372.     return _first##NameTo;
  373.  
  374. #define METHOD_STATIC_MULTI_GETLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  375.     return _last##NameTo;
  376.  
  377. #define METHOD_STATIC_MULTI_GETNEXT(ClassFrom, NameFrom, ClassTo, NameTo) \
  378.     if (pos == (ClassTo*)0)\
  379.         return _first##NameTo;\
  380. \
  381.     assert((pos->_prev##NameFrom != (ClassTo*)0) ||\
  382.             (pos->_next##NameFrom != (ClassTo*)0) ||\
  383.             (_first##NameTo == pos));\
  384. \
  385.     return pos->_next##NameFrom;
  386.  
  387. #define METHOD_STATIC_MULTI_GETPREV(ClassFrom, NameFrom, ClassTo, NameTo) \
  388.     if (pos == (ClassTo*)0)\
  389.         return _last##NameTo;\
  390. \
  391.     assert((pos->_prev##NameFrom != (ClassTo*)0) ||\
  392.             (pos->_next##NameFrom != (ClassTo*)0) ||\
  393.             (_first##NameTo == pos));\
  394. \
  395.     return pos->_prev##NameFrom;
  396.  
  397. #define METHOD_STATIC_MULTI_GETCOUNT(ClassFrom, NameFrom, ClassTo, NameTo) \
  398.     return _count##NameTo;
  399.  
  400. #define METHOD_STATIC_MULTI_INCLUDES(ClassFrom, NameFrom, ClassTo, NameTo) \
  401.     assert(item);\
  402.     if (item->_prev##NameFrom || item->_next##NameFrom || (_first##NameTo == item))\
  403.         return 1;\
  404. \
  405.     return 0;
  406.  
  407. #define METHOD_STATIC_MULTI_MOVEFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  408.     Remove##NameTo(item);\
  409.     Add##NameTo##First(item);
  410.  
  411. #define METHOD_STATIC_MULTI_MOVELAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  412.     Remove##NameTo(item);\
  413.     Add##NameTo##Last(item);
  414.  
  415. #define METHOD_STATIC_MULTI_MOVEAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  416.     Remove##NameTo(item);\
  417.     Add##NameTo##After(item, pos);
  418.  
  419. #define METHOD_STATIC_MULTI_MOVEBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  420.     Remove##NameTo(item);\
  421.     Add##NameTo##Before(item, pos);
  422.  
  423. #define METHOD_STATIC_MULTI_SORT(ClassFrom, NameFrom, ClassTo, NameTo) \
  424.     for (ClassTo* a = GetFirst##NameTo(); a; a = GetNext##NameTo(a))\
  425.     {\
  426.         ClassTo* b = GetNext##NameTo(a);\
  427. \
  428.         while (b && (comp(a, b) > 0))\
  429.         {\
  430.             Remove##NameTo(b);\
  431.             ClassTo* c = GetPrev##NameTo(a);\
  432.             while (c && (comp(c, b) > 0))\
  433.                 c = GetPrev##NameTo(c);\
  434. \
  435.             if (c)\
  436.                 Add##NameTo##After(b, c);\
  437.             else\
  438.                 Add##NameTo##First(b);\
  439. \
  440.             b = GetNext##NameTo(a);\
  441.         }\
  442.     }
  443.  
  444. #define METHODS_STATIC_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  445.  
  446. #endif
  447.